home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-01-22 | 11.0 KB | 444 lines | [TEXT/CWIE] |
- // ===========================================================================
- // CPrefFile.cp ©1996 Sunbay Development Group. All rights reserved.
- // ===========================================================================
- //
-
- #ifdef PowerPlant_PCH
- #include PowerPlant_PCH
- #endif
-
- #ifndef __ALIASES__
- #include <Aliases.h>
- #endif
-
- #ifndef __FILES__
- #include <Files.h>
- #endif
-
- #ifndef __FOLDERS__
- #include <Folders.h>
- #endif
-
- #ifndef __RESOURCESES__
- #include <Resources.h>
- #endif
-
- #ifndef __ERRORS__
- #include <Errors.h>
- #endif
-
- #include <String_Utils.h>
-
- #include "CPrefFile.h"
-
- const Int16 refNum_Undefined = -1;
-
- // ===========================================================================
- #pragma mark •--- Constructors
- // ===========================================================================
-
- // ---------------------------------------------------------------------------
- // Constructors
- // ---------------------------------------------------------------------------
-
- CPrefFile::CPrefFile(void) : LFile() {
- }
-
- CPrefFile::CPrefFile(ConstStr255Param inFileName, Boolean inCreateFolder) : LFile() {
- Int16 vref;
- Int32 dirID;
- OSErr error;
-
- error = ::FindFolder( kOnSystemDisk,
- kPreferencesFolderType,
- inCreateFolder,
- &vref,
- &dirID);
- if(error == noErr)
- error = ::FSMakeFSSpec(vref, dirID, inFileName, &mMacFileSpec);
- else
- CopyPStr(inFileName, mMacFileSpec.name, sizeof (Str63));
- }
-
- // ---------------------------------------------------------------------------
- // Set new file name
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::SetName(ConstStr255Param inFileName, Boolean inCreateFolder) {
- Int16 vref;
- Int32 dirID;
- OSErr error;
-
- // Has file not been closed?
- if(mDataForkRefNum != refNum_Undefined || mResourceForkRefNum != refNum_Undefined)
- return opWrErr;
- // Default initialisation for file specification
- mMacFileSpec.vRefNum = 0;
- mMacFileSpec.parID = 0;
- mMacFileSpec.name[0] = 0;
- // Find preferences folder
- error = ::FindFolder( kOnSystemDisk,
- kPreferencesFolderType,
- inCreateFolder,
- &vref,
- &dirID);
- if(error != noErr) return error;
- // Set new name
- error = ::FSMakeFSSpec(vref, dirID, inFileName, &mMacFileSpec);
- return error;
- }
-
- // ===========================================================================
- #pragma mark •--- Create group
- // ===========================================================================
-
- // ---------------------------------------------------------------------------
- // Create new file
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::CreateFile(
- OSType inCreator,
- OSType inFileType,
- ScriptCode inScriptCode)
- {
- FInfo finfo;
- OSErr error;
-
- if(mDataForkRefNum != refNum_Undefined || mResourceForkRefNum != refNum_Undefined) {
- // File has not been closed
- return opWrErr;
- }
- if((error = ::FSpCreate(&mMacFileSpec, inCreator, inFileType, inScriptCode)) == noErr) {
- ::FSpCreateResFile(&mMacFileSpec, inCreator, inFileType, inScriptCode);
- error = ::ResError();
- }
- return error;
- }
-
- // ---------------------------------------------------------------------------
- // Create data fork
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::CreateDatFork(
- OSType inCreator,
- OSType inFileType,
- ScriptCode inScriptCode)
- {
- short refn;
- OSErr error = noErr;
-
- if(mDataForkRefNum != refNum_Undefined)
- return noErr;
- // Does data fork exist?
- if((error = ::FSpOpenDF(&mMacFileSpec, fsRdPerm, &refn)) == noErr) {
- ::FSClose(refn);
- return noErr;
- }
- // Data fork does not exist
- error = ::FSpCreate(&mMacFileSpec, inCreator, inFileType, inScriptCode);
- return error;
- }
-
- // ---------------------------------------------------------------------------
- // Create resource fork
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::CreateResFork(
- OSType inCreator,
- OSType inFileType,
- ScriptCode inScriptCode)
- {
- short refn;
- OSErr error = noErr;
-
- if(mResourceForkRefNum != refNum_Undefined)
- return noErr;
- // Does resource fork exist?
- refn = ::FSpOpenResFile(&mMacFileSpec, fsRdPerm);
- if(::ResError() == noErr) {
- ::CloseResFile(refn);
- return noErr;
- }
- // Resource fork does not exist
- ::FSpCreateResFile(&mMacFileSpec, inCreator, inFileType, inScriptCode);
- error = ::ResError();
- return error;
- }
-
- // ===========================================================================
- #pragma mark •--- Open group
- // ===========================================================================
-
- // ---------------------------------------------------------------------------
- // Open resource fork
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::OpenResFork(Int16 inPrivileges) {
- OSErr error = noErr;
-
- mResourceForkRefNum = ::FSpOpenResFile(&mMacFileSpec, inPrivileges);
- if(mResourceForkRefNum == refNum_Undefined) {
- error = ::ResError();
- mResourceForkRefNum = refNum_Undefined;
- }
- return error;
- }
-
- // ---------------------------------------------------------------------------
- // Open data fork
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::OpenDatFork(Int16 inPrivileges) {
- OSErr error = noErr;
-
- error = ::FSpOpenDF(&mMacFileSpec, inPrivileges, &mDataForkRefNum);
- if(error != noErr)
- mDataForkRefNum = refNum_Undefined;
- return error;
- }
-
- // ===========================================================================
- #pragma mark •--- Close group
- // ===========================================================================
-
- // ---------------------------------------------------------------------------
- // Close data fork
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::CloseDatFork(void) {
- OSErr error = noErr;
-
- if(mDataForkRefNum != refNum_Undefined) {
- // Close data fork
- error = ::FSClose(mDataForkRefNum);
- mDataForkRefNum = refNum_Undefined;
- if(error != noErr) return error;
- ::FlushVol(nil, mMacFileSpec.vRefNum);
- }
- return error;
- }
-
- // ---------------------------------------------------------------------------
- // Closer resource fork
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::CloseResFork(void) {
- OSErr error = noErr;
-
- if(mResourceForkRefNum != refNum_Undefined) {
- // Close resource fork
- ::CloseResFile(mResourceForkRefNum);
- error = ::ResError();
- mResourceForkRefNum = refNum_Undefined;
- if(error != noErr) return error;
- ::FlushVol(nil, mMacFileSpec.vRefNum);
- }
- return error;
- }
-
- // ===========================================================================
- #pragma mark •--- Resource support group
- // ===========================================================================
-
- // ---------------------------------------------------------------------------
- // Create new resource
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::NewResource(
- void * resdata,
- long ressize,
- ResType restype,
- short resid,
- ConstStr255Param resname)
- {
-
- enum modet {
- mdStart,
- mdResFExist,
- mdResRdError,
- mdMemAlloc,
- mdSuccess
- };
-
- short refn;
- Handle resH;
- modet mode;
- OSErr error;
-
- if(mResourceForkRefNum == refNum_Undefined) return resFNotFound;
- for(;;) {
- mode = mdStart;
- refn = ::CurResFile();
- if(refn != mResourceForkRefNum) {
- ::UseResFile(mResourceForkRefNum);
- if((error = ::ResError()) != noErr) break;
- }
- mode = mdResFExist;
- // Is target resource exist
- if((resH = ::Get1Resource(restype, resid)) != nil) break;
- mode = mdResRdError;
- error = ::ResError();
- if(!(error != resNotFound || error != noErr)) break;
- // Prepare handle
- if((error = ::PtrToHand(resdata, &resH, ressize)) != noErr) break;
- mode = mdMemAlloc;
- ::HNoPurge(resH);
- ::AddResource(resH, restype, resid, resname);
- if((error = ::ResError()) != noErr) break;
- ::WriteResource(resH);
- ::HPurge(resH);
- if((error = ::ResError()) != noErr) break;
- ::ReleaseResource(resH);
- mode = mdSuccess;
- break;
- }
- switch(mode) {
- case mdSuccess:
- error = noErr;
- break;
- case mdResFExist:
- ::ReleaseResource(resH);
- error = addResFailed;
- break;
- case mdMemAlloc:
- ::DisposeHandle(resH);
- case mdStart:
- case mdResRdError:
- default:
- break;
- }
- if(refn != mResourceForkRefNum) ::UseResFile(refn);
- return error;
- }
-
- // ---------------------------------------------------------------------------
- // Put into resource
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::PutResource(
- void * resdata,
- long ressize,
- ResType restype,
- short resid,
- ConstStr255Param resname)
- {
-
- enum modet {
- mdStart,
- mdResExist,
- mdResRdOk,
- mdMemAlloc,
- mdSuccess
- };
-
- short refn;
- Handle resH;
- modet mode;
- OSErr error;
-
- if(mResourceForkRefNum == refNum_Undefined) return resFNotFound;
- for(;;) {
- mode = mdStart;
- refn = ::CurResFile();
- if(refn != mResourceForkRefNum) {
- ::UseResFile(mResourceForkRefNum);
- if((error = ::ResError()) != noErr) break;
- }
- mode = mdResExist;
- // Is target resource exist
- if((resH = ::Get1Resource(restype, resid)) == nil) break;
- mode = mdResRdOk;
- // Prepare handle
- if((error = ::PtrToXHand(resdata, resH, ressize)) != noErr) break;
- mode = mdMemAlloc;
- ::HNoPurge(resH);
- ::ChangedResource(resH);
- if((error = ::ResError()) != noErr) break;
- ::WriteResource(resH);
- if((error = ::ResError()) != noErr) break;
- ::HPurge(resH);
- ::ReleaseResource(resH);
- error = ::ResError();
- mode = mdSuccess;
- break;
- }
- switch(mode) {
- case mdMemAlloc:
- ::HPurge(resH);
- case mdResRdOk:
- ::ReleaseResource(resH);
- break;
- case mdResExist:
- error = resNotFound;
- break;
- case mdStart:
- case mdSuccess:
- default:
- break;
- }
- if(refn != mResourceForkRefNum) ::UseResFile(refn);
- return error;
- }
-
- // ---------------------------------------------------------------------------
- // Get from resource
- // ---------------------------------------------------------------------------
-
- OSErr CPrefFile::GetResource(
- void * resdata,
- long ressize,
- ResType restype,
- short resid,
- ConstStr255Param resname)
- {
-
- enum modet {
- mdStart,
- mdResExist,
- mdResRdOk,
- mdSuccess
- };
-
- short refn;
- Handle resH;
- modet mode;
- OSErr error;
-
- if(mResourceForkRefNum == refNum_Undefined) return resFNotFound;
- if(resdata == nil) return notEnoughMemoryErr;
- for(;;) {
- mode = mdStart;
- refn = ::CurResFile();
- if(refn != mResourceForkRefNum) {
- ::UseResFile(mResourceForkRefNum);
- if((error = ::ResError()) != noErr) break;
- }
- mode = mdResExist;
- // Is target resource exist
- if((resH = ::Get1Resource(restype, resid)) == nil) break;
- mode = mdResRdOk;
- // Copy read resource to the pointer
- ::HLock(resH);
- ::BlockMove(*resH, resdata, ressize);
- ::HUnlock(resH);
- ::ReleaseResource(resH);
- error = ::ResError();
- mode = mdSuccess;
- break;
- }
- switch(mode) {
- case mdResRdOk:
- ::ReleaseResource(resH);
- break;
- case mdResExist:
- error = resNotFound;
- break;
- case mdStart:
- case mdSuccess:
- default:
- break;
- }
- if(refn != mResourceForkRefNum) ::UseResFile(refn);
- return error;
- }
-